#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>  // 添加 errno 头文件

// 函数指针类型
typedef void (*handler_t)();

// 函数声明
void fun_one(void);
void fun_two(void);
void Load(void);
void handler(void);

// 全局函数指针数组
handler_t handlers[2];
int handler_count = 0;

void fun_one(void) {
    printf("这是一个临时任务1\n");
}

void fun_two(void) {
    printf("这是一个临时任务2\n");
}

void Load(void) {
    handlers[0] = fun_one;
    handlers[1] = fun_two;
    handler_count = 2;
}

void handler(void) {
    if (handler_count == 0)
        Load();
    
    for (int i = 0; i < handler_count; i++) {
        handlers[i]();
    }
}

int main(void) 
{
    pid_t pid;
    pid = fork();
    
    if (pid < 0) {
        printf("%s fork error: %s\n", __func__, strerror(errno));
        return 1;
    } else if (pid == 0) { // child
        printf("child is running, pid is: %d\n", getpid());
        sleep(5);
        exit(1);
    } else { // parent
        int status = 0;
        pid_t ret = 0;
        
        do {
            ret = waitpid(-1, &status, WNOHANG); // 非阻塞式等待
            
            if (ret == 0) {
                printf("child is still running\n");
            } else if (ret < 0) {
                printf("waitpid error: %s\n", strerror(errno));
                return 1;
            }
            
            handler();
            sleep(1); // 添加短暂休眠，避免过度占用CPU
            
        } while (ret == 0);
        
        if (WIFEXITED(status) && ret == pid) {
            printf("wait child 5s success, child return code is: %d\n", WEXITSTATUS(status));
        } else {
            printf("wait child failed\n");
            return 1;
        }
    }
    
    return 0;
}
